package ar.uba.fi.tecnicas.fabrica;

import java.util.ArrayList;
import java.util.List;

public class TipoProducto 
{
	private String nombre;
	private double precio;
	private double capitalInversion; 
	private List<Transformacion> transformaciones;
	private List<MateriaPrima> materiasPrima;
	
	public TipoProducto(String nombre, double precio, double capitalInversion)
	{
		this.nombre = nombre;
		this.precio = precio;
		this.capitalInversion = capitalInversion;
		this.transformaciones = new ArrayList<Transformacion>();
		this.materiasPrima = new ArrayList<MateriaPrima>();
	}
	
	public String getNombre()
	{
		return this.nombre;
	}
	
	public double getPrecio() 
	{
		return this.precio;
	}
	
	public double getCapitalInversion()
	{
		return this.capitalInversion;
	}	
	
	public void agregarMateriaPrima(MateriaPrima materiaPrima)
	{
		this.materiasPrima.add(materiaPrima);
	}
	
	public void agregarTransformacion(Transformacion transformacion)
	{
		this.transformaciones.add(transformacion);
	}
	
	public List<MateriaPrima> getMateriasPrimas()
	{
		return this.materiasPrima;
	}
	
	public List<Transformacion> getTransformaciones()
	{
		return this.transformaciones;
	}
	
	public boolean esProducto(Pieza pieza)
	{
		boolean tieneTransformaciones = true;
		
		List<Transformacion> transformacionesPieza = pieza.getTransformaciones();
		
		for(Transformacion transformacion : this.transformaciones)
		{
			if(!transformacionesPieza.contains(transformacion))
			{
				tieneTransformaciones = false;
				break;
			}
		}
		
		boolean tieneMateriasPrima = true;
		
		List<MateriaPrima> materiasPrimaPieza = pieza.getMateriasPrimas();

		for(MateriaPrima materiaPrima : this.materiasPrima)
		{
			// La comparacion se realiza por medio del metodo equal overriden 
			if(!materiasPrimaPieza.contains(materiaPrima))
			{
				tieneMateriasPrima = false;
				break;
			}
		}
		
		if(tieneTransformaciones && tieneMateriasPrima)
		{
			pieza.setTipoProducto(this);
		}

		return tieneTransformaciones && tieneMateriasPrima;
	}
}
